\section{Descrição das implementações realizadas}
A implementação consiste num programa \emph{MPI} onde os clientes possuem \emph{rank} ímpar, e os servidores par.
Cada servidor mantém uma fila \emph{FIFO} para cada servidor existente, incluindo ele próprio, onde as mensagens respectivas são adicionadas.

\subsection{Tipos de mensagens}
Comecemos pelos tipos de mensagens. Notamos que todas as mensagens entre servidores levam o relógio lógico do emissor:
\begin{description}
	\item[\emph{GET\_CLT}] Enviada por um cliente aquando da execução de um \textbf{get()};
	
	\item[\emph{GET\_SRV}] Enviada por um servidor em resposta a \emph{GET\_CLT}, com o valor da sua cópia local;
	
	\item[\emph{SET}] Enviada por um cliente aquando da execução de um \textbf{set(int v)}, com o valor de \emph{v};
	
	\item[\emph{WRITE}] Enviada por um servidor a todos os outros aquando da recepção de \emph{SET}, com o valor da actualização da variável (actualizar);
	
	\item[\emph{INQUIRE}] Enviada por um servidor para outro, quando a fila respectiva ao segundo está vazia, no primeiro (inquirir);
	
	\item[\emph{ACK}] Enviada por um servidor para outro em resposta a \emph{INQUIRE} (confirmar);
	
	\item[\emph{STOP\_CLT}] Enviada por um cliente quando não vai enviar mais \emph{SET}. Tem como objectivo terminar a execução dos servidores assim que todos os clientes a tenham enviado;
	
	\item[\emph{STOP\_SRV}] Enviada por um servidor a todos os outros, aquando da recepção de \emph{STOP\_CLT} do seu cliente local.
\end{description}

\subsection{Estados da fila}
Cada fila associada a um servidor pode estar em 1 de 4 estados:
\begin{description}
	\item[\emph{EMPTY}] Não contém nenhum elemento;
	
	\item[\emph{WAITING\_ACK}] Não contém nenhum elemento, contudo já foi enviado um \emph{INQUIRE} ao servidor respectivo;
	
	\item[\emph{NOT\_EMPTY}] Há pelo menos um elemento para ser processado;
	
	\item[\emph{FINISHED}] O cliente local ao servidor respectivo não irá enviar mais actualizações, a fila pode ser ignorada.
\end{description}

\subsection{Algoritmo}
Apresentamos os diagramas das partes mais relevantes.

\subsubsection{Ciclo principal de um servidor}
\begin{figure}[H]
	\begin{center}
		\includegraphics{img/main}
		\caption{Ciclo principal de um servidor}
	\end{center}
\end{figure}
Por ``todas as filas totalmente tratadas'', entenda-se todas as filas no estado \emph{FINISHED}.

\subsubsection{Tratamento de uma mensagem}
\begin{figure}[H]
	\begin{center}
		\includegraphics[width=\textwidth]{img/msg_process}
		\caption{Tratamento de uma mensagem}
	\end{center}
\end{figure}

\subsubsection{Tratamento das filas}
\begin{figure}[H]
	\begin{center}
		\includegraphics{img/queue_process}
		\caption{Tratamento das filas}
	\end{center}
\end{figure}